import { getFieldType } from "@/components/CLTable/index.ts";

export function deepCopy<T>(obj: T): T {
  let result: T;
  if (obj != null && typeof obj === "object") {
    result = (Array.isArray(obj) ? [] : {}) as T;
    for (const i in obj) {
      result[i] = typeof obj[i] === "object" ? deepCopy(obj[i]) : obj[i];
    }
  } else {
    result = obj;
  }
  return result;
}

export const hexToRgba = (hex: string, alpha: number) => {
  if (!hex) return "";
  // 去掉前缀#
  hex = hex.replace("#", "");

  // 将16进制分解为RGB
  const r = parseInt(hex.substring(0, 2), 16);
  const g = parseInt(hex.substring(2, 4), 16);
  const b = parseInt(hex.substring(4, 6), 16);

  // 返回RGBA格式
  return `rgba(${r}, ${g}, ${b}, ${alpha})`;
};
/**
 * 将各种日期格式转换为指定格式的日期字符串
 * @param dateInput 日期输入，支持多种格式
 * @param formatType 输出格式类型：'iso' | 'datetime'
 * @returns 指定格式的日期字符串，如果转换失败返回空字符串
 */
export function formatDate(
  dateInput: string | number | Date,
  formatType: "iso" | "datetime" = "iso",
): string | null {
  if (!dateInput) return null;

  try {
    let date: Date;

    // 处理数字类型（时间戳）
    if (typeof dateInput === "number") {
      // 判断是秒级还是毫秒级时间戳
      date =
        dateInput.toString().length > 10
          ? new Date(dateInput)
          : new Date(dateInput * 1000);
    }
    // 处理字符串类型
    else if (typeof dateInput === "string") {
      // 处理 "2022-11-22" 这种缺少时间的格式 - 直接构造日期对象避免时区问题
      if (/^\d{4}-\d{1,2}-\d{1,2}$/.test(dateInput)) {
        const [year, month, day] = dateInput.split("-").map(Number);
        date = new Date(year, month - 1, day, 0, 0, 0, 0);
      }
      // 处理 "2022-11-22 12:12:12" 这种空格分隔的格式
      else if (
        /^\d{4}-\d{1,2}-\d{1,2}\s+\d{1,2}:\d{1,2}:\d{1,2}$/.test(dateInput)
      ) {
        const [datePart, timePart] = dateInput.split(" ");
        const [year, month, day] = datePart.split("-").map(Number);
        const [hours, minutes, seconds] = timePart.split(":").map(Number);
        date = new Date(year, month - 1, day, hours, minutes, seconds);
      }
      // 尝试直接解析其他格式
      else {
        date = new Date(dateInput);

        // 如果解析失败，尝试处理中文日期格式等
        if (isNaN(date.getTime())) {
          // 移除中文字符等可能影响解析的内容
          const cleanedDate = dateInput
            .replace(/[年月]/g, "-")
            .replace(/[日时分秒]/g, "")
            .replace(/\s+/g, " ")
            .trim();

          date = new Date(cleanedDate);
        }
      }
    }
    // 处理 Date 对象
    else {
      date = dateInput;
    }

    // 最终验证
    if (isNaN(date.getTime())) {
      console.warn("无法解析日期:", dateInput);
      return "";
    }

    // 根据格式类型返回不同格式的字符串
    if (formatType === "datetime") {
      // 格式化为 YYYY-MM-DD HH:mm:ss - 使用本地时间
      const year = date.getFullYear();
      const month = String(date.getMonth() + 1).padStart(2, "0");
      const day = String(date.getDate()).padStart(2, "0");
      const hours = String(date.getHours()).padStart(2, "0");
      const minutes = String(date.getMinutes()).padStart(2, "0");
      const seconds = String(date.getSeconds()).padStart(2, "0");

      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    } else {
      // 默认返回 ISO 格式
      return date.toISOString();
    }
  } catch (error) {
    console.error("日期转换错误:", error);
    return "";
  }
}

export function typexToType(typex: string) {
  return getFieldType(typex);
}

export function convertFileToBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();

    reader.onload = function (e) {
      // 获取 Base64 编码的字符串
      const base64String = e.target.result;
      resolve(base64String);
    };

    reader.onerror = function (error) {
      reject(error);
    };

    // 读取文件为 Data URL（Base64 格式）
    reader.readAsDataURL(file);
  });
}
